package common;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;



/**
 * 实现对测试数据testdata的操作
 * @author MaoJJ
 *
 */
public class TestData
{
	/**
	 * 测试数据文件
	 */
	private Document document;
	
	/**
	 * TestData类的构造方法
	 * @param fileName - testdata目录测试数据文件名
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public TestData(String fileName) throws ParserConfigurationException, SAXException, IOException
	{
		fileName = System.getProperty("user.dir")
				+ File.separator + "src"
				+ File.separator + "testdata"
				+ File.separator + fileName;
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        this.document = db.parse(fileName);
    }
	
	/**
	 * 获取测试数据中所有用例的所有参数值（非场景）
	 * @return 测试数据中所有用例的所有参数值
	 */
	public String[][] getParam()
	{
		return getParam(null);
	}
	
	/**
	 * 获取测试数据中所有用例的所有参数值（场景）
	 * @param scene - XML文件中场景节点名称
	 * @return
	 */
	public String[][] getParam(String  scene)
	{
		String[][]  paramArrays;
		List<String[]> paramLists = new ArrayList<>();
		
		NodeList caseNodeList = null;
		if (scene == null)
		{
			//根据Host.getName()获取对应环境的用例case列表
			caseNodeList = document.getElementsByTagName(Host.getName()).item(0).getChildNodes();
		}
		else
		{
			//根据场景名称scene获取环境host列表
			NodeList hostNodeList = document.getElementsByTagName(scene).item(0).getChildNodes();
			
			//根据Host.getName()获取对应环境的用例case列表
			for (int i=0; i<hostNodeList.getLength(); i++)
			{
				if (hostNodeList.item(i).getNodeName().equalsIgnoreCase(Host.getName()))
				{
					caseNodeList = hostNodeList.item(i).getChildNodes();
					break;
				}
			}
		}

		for (int i=0; i<caseNodeList.getLength(); i++)
		{
			String[] paramArray;
			List<String> paramList = new ArrayList<>();
			
			Node caseNode = caseNodeList.item(i);
			if (caseNode instanceof Element)
			{	
				paramList.add(caseNode.getNodeName());
				NodeList paramNodeList = caseNode.getChildNodes();
				for (int j=0; j<paramNodeList.getLength(); j++)
				{
					Node paramNode = paramNodeList.item(j);
					if (paramNode instanceof Element)
					{
						if (paramNode.getTextContent().equalsIgnoreCase("null"))
						{
							paramList.add(null);
						}
						else
						{
							paramList.add(paramNode.getTextContent());
						}
					}
				}
				paramArray = new String[paramList.size()];
				paramList.toArray(paramArray);
				paramLists.add(paramArray);
			}
			
		}
		
		paramArrays = new String[paramLists.size()][];
		paramLists.toArray(paramArrays);
		return paramArrays;
	}
	
	/**
	 * 获取分场景测试数据中指定用例的指定参数值
	 * @param SenseName 场景名称
	 * @param CaseName 用例名称
	 * @param DataName 参数名称
	 * @return
	 */
	public String getData(String SenseName,String CaseName,String DataName)
	{
		String Data=null;
		NodeList caseNodeList = null;
		if (SenseName==null)
		{
			caseNodeList = document.getElementsByTagName(Host.getName()).item(0).getChildNodes();
		}
		else 
		{
			//根据场景名称scene获取环境host列表
			NodeList hostNodeList = document.getElementsByTagName(SenseName).item(0).getChildNodes();
			
			//根据Host.getName()获取对应环境的用例case列表
			for (int i=0; i<hostNodeList.getLength(); i++)
			{
				if (hostNodeList.item(i).getNodeName().equalsIgnoreCase(Host.getName()))
				{
					caseNodeList = hostNodeList.item(i).getChildNodes();
					break;
				}
			}
		}
		for (int i=0;i<caseNodeList.getLength();i++)
		{
			if (caseNodeList.item(i).getNodeName().equals(CaseName))
			{
				NodeList elementlist=caseNodeList.item(i).getChildNodes();
				for (int j=0;j<elementlist.getLength();j++)
				{
					if (elementlist.item(j).getNodeName().equals(DataName))
					{
						Data=elementlist.item(j).getTextContent();
						break;
					}
				}
				break;
			}
		}
		return Data;
	}
	
	/**
	 * 获取测试数据中指定用例的指定参数值
	 * @param CaseName 用例名称
	 * @param DataName 数据名称
	 * @return
	 */
	public String getData(String CaseName,String DataName)
	{
		String Data=getData(null, CaseName, DataName);
		return Data;
	}
}
	